Skip to content

feat(automation): object-form screen-flow steps + CRM lead→customer/opportunity wizard#1977

Merged
os-zhuang merged 2 commits into
mainfrom
feat/master-detail-convert-wizard
Jun 16, 2026
Merged

feat(automation): object-form screen-flow steps + CRM lead→customer/opportunity wizard#1977
os-zhuang merged 2 commits into
mainfrom
feat/master-detail-convert-wizard

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

What

Extends the screen-flow runtime so a screen node can render a target object's full create/edit form — including inline master-detail child grids — instead of a flat field list, and ships a CRM lead-conversion wizard that uses it.

A step that declares config.objectName emits an object-form ScreenSpec. The client (objectui FlowRunner, companion PR) renders the real ObjectForm, persists the record (and its children, atomically), and resumes the run with the new record's id bound to config.idVariable so a later step can reference it. Model: the form persists itself, the flow orchestrates the sequence and threads the new ids.

CRM example — Convert Lead → Customer + Opportunity

convert-lead.flow is now a two-step wizard:

  1. Step 1 — a full Customer (Account) form, prefilled from the lead (name ← company).
  2. Step 2 — a full Opportunity form with an editable product line-item grid (new crm_opportunity_line_item, master_detail + inlineEdit: 'grid'; Opportunity gains a line_total rollup). Account FK prefilled with Step 1's new id.

The flow then marks the lead converted and links it to the new account + opportunity.

Bug fix bundled here

get_lead used config.recordId, but the get_record node only reads config.filter — so it silently returned the first lead regardless of the record acted on. Now filters by { id: '{recordId}' }. (The old wizard never surfaced this because it never visibly used the loaded record.)

Changes

  • spec: ScreenSpec gains kind / objectName / mode / recordId / defaults / idVariable.
  • service-automation: the screen node emits object-form specs and now interpolates title / description / field defaultValue / object-form defaults against live flow variables (the engine does not pre-interpolate node config).
  • app-crm: new crm_opportunity_line_item object, Opportunity.line_total summary, rewritten convert-lead wizard; smoke test updated for the 6th object.

Verification

End-to-end in the browser (objectui console against app-crm): Convert Lead → full Customer form (prefilled) saves → full Opportunity form + product grid (prefilled, live amount calc) saves → lead converted, linked to account + opportunity, line_total rolled up. app-crm smoke test (29 cases) passes; service-automation builds clean.

Requires the objectui companion PR (feat/flow-object-form-screen) for the renderer side.

🤖 Generated with Claude Code

…pportunity wizard

Extend the screen-flow runtime so a `screen` node can render a target object's
FULL create/edit form — including inline master-detail child grids — instead of
a flat field list. A step that declares `config.objectName` emits an
`object-form` ScreenSpec; the client renders the real ObjectForm, persists the
record (and its children, atomically), and resumes the run with the new id
bound to `config.idVariable` so a later step can reference it.

CRM example: convert-lead.flow is now a two-step wizard — Step 1 a full Customer
(Account) form prefilled from the lead, Step 2 a full Opportunity form WITH an
editable product line-item grid (new crm_opportunity_line_item, master_detail +
inlineEdit:'grid'; Opportunity gains a line_total rollup). The flow then marks
the lead converted and links it to the new account + opportunity.

Also fixes get_lead: get_record reads `config.filter`, not a bare
`config.recordId`, so the node now filters by `{ id: '{recordId}' }` instead of
silently returning the first record.

- spec: ScreenSpec gains kind/objectName/mode/recordId/defaults/idVariable
- service-automation: screen node emits object-form specs + interpolates
  title/description/field-defaults/object-form-defaults against flow vars
- app-crm: new line-item object, Opportunity line_total summary, rewritten
  convert-lead wizard, smoke test updated for the 6th object

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): packages/services, @objectstack/spec.

91 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx (via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/implementation-status.mdx (via @objectstack/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/concepts/packages.mdx (via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx (via @objectstack/spec)
  • content/docs/concepts/skills.mdx (via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx (via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx (via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx (via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx (via @objectstack/spec)
  • content/docs/guides/api-reference.mdx (via @objectstack/spec)
  • content/docs/guides/business-logic.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx (via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx (via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx (via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx (via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx (via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx (via packages/spec)
  • content/docs/guides/data-modeling.mdx (via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx (via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/guides/formula.mdx (via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx (via packages/spec)
  • content/docs/guides/kernel-services.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx (via @objectstack/spec)
  • content/docs/guides/packages.mdx (via packages/services, @objectstack/spec)
  • content/docs/guides/plugin-development.mdx (via @objectstack/spec)
  • content/docs/guides/plugins.mdx (via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx (via @objectstack/spec)
  • content/docs/guides/public-forms.mdx (via @objectstack/spec)
  • content/docs/guides/runtime-services/audit-service.mdx (via packages/services)
  • content/docs/guides/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/index.mdx (via packages/services, packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/settings-service.mdx (via packages/services)
  • content/docs/guides/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/guides/security.mdx (via @objectstack/spec)
  • content/docs/guides/seed-data.mdx (via @objectstack/spec)
  • content/docs/guides/skills.mdx (via @objectstack/spec)
  • content/docs/guides/standards.mdx (via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via packages/services, @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jun 16, 2026 4:22pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tooling labels Jun 16, 2026
@os-zhuang
os-zhuang merged commit 6bec07e into main Jun 16, 2026
13 of 14 checks passed
@os-zhuang
os-zhuang deleted the feat/master-detail-convert-wizard branch June 16, 2026 16:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant